listbox: Add a ::show-separators property
authorMatthias Clasen <mclasen@redhat.com>
Sat, 13 Apr 2019 00:24:40 +0000 (20:24 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 13 Apr 2019 00:24:40 +0000 (20:24 -0400)
This is getting translated into a .separators style
class on the list box css node.

docs/reference/gtk/gtk4-sections.txt
gtk/gtklistbox.c
gtk/gtklistbox.h

index 32a1ad59f7d0acccf736d5e7e22163d29abc8aca..91aad5becdac04aa810f761c1324b92ecc666ada 100644 (file)
@@ -362,6 +362,8 @@ gtk_list_box_get_selected_row
 GtkListBoxForeachFunc
 gtk_list_box_selected_foreach
 gtk_list_box_get_selected_rows
+gtk_list_box_set_show_separators
+gtk_list_box_get_show_separators
 
 gtk_list_box_set_selection_mode
 gtk_list_box_get_selection_mode
index f6ccfb1931b52c28fb63ad89147511d6077ac68a..bde8540dc76adc677505f0478f9de8d5c60a1a4b 100644 (file)
  * # CSS nodes
  *
  * |[<!-- language="plain" -->
- * list
+ * list[.separators]
  * ╰── row[.activatable]
  * ]|
  *
- * GtkListBox uses a single CSS node named list. Each GtkListBoxRow uses
+ * GtkListBox uses a single CSS node named list. It may carry the .separators style
+ * class, when the #GtkListBox::show-separators property is set. Each GtkListBoxRow uses
  * a single CSS node named row. The row nodes get the .activatable
  * style class added when appropriate.
  */
@@ -113,6 +114,7 @@ typedef struct
   GtkAdjustment *adjustment;
   gboolean activate_single_click;
   gboolean accept_unpaired_release;
+  gboolean show_separators;
 
   /* DnD */
   GtkListBoxRow *drag_highlighted_row;
@@ -160,6 +162,7 @@ enum {
   PROP_SELECTION_MODE,
   PROP_ACTIVATE_ON_SINGLE_CLICK,
   PROP_ACCEPT_UNPAIRED_RELEASE,
+  PROP_SHOW_SEPARATORS,
   LAST_PROPERTY
 };
 
@@ -332,6 +335,9 @@ gtk_list_box_get_property (GObject    *obj,
     case PROP_ACCEPT_UNPAIRED_RELEASE:
       g_value_set_boolean (value, priv->accept_unpaired_release);
       break;
+    case PROP_SHOW_SEPARATORS:
+      g_value_set_boolean (value, priv->show_separators);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
       break;
@@ -357,6 +363,9 @@ gtk_list_box_set_property (GObject      *obj,
     case PROP_ACCEPT_UNPAIRED_RELEASE:
       gtk_list_box_set_accept_unpaired_release (box, g_value_get_boolean (value));
       break;
+    case PROP_SHOW_SEPARATORS:
+      gtk_list_box_set_show_separators (box, g_value_get_boolean (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
       break;
@@ -446,6 +455,13 @@ gtk_list_box_class_init (GtkListBoxClass *klass)
                           FALSE,
                           G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
 
+  properties[PROP_SHOW_SEPARATORS] =
+    g_param_spec_boolean ("show-separators",
+                          P_("Show separators"),
+                          P_("Show separators between rows"),
+                          FALSE,
+                          G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (object_class, LAST_PROPERTY, properties);
 
   /**
@@ -3599,3 +3615,51 @@ gtk_list_box_bind_model (GtkListBox                 *box,
   g_signal_connect (priv->bound_model, "items-changed", G_CALLBACK (gtk_list_box_bound_model_changed), box);
   gtk_list_box_bound_model_changed (model, 0, 0, g_list_model_get_n_items (model), box);
 }
+
+/**
+ * gtk_list_box_set_show_separators:
+ * @box: a #GtkListBox
+ * @show_separators: %TRUE to show separators
+ *
+ * Sets whether the list box should show separators
+ * between rows.
+ */
+void
+gtk_list_box_set_show_separators (GtkListBox *box,
+                                  gboolean    show_separators)
+{
+  GtkListBoxPrivate *priv = BOX_PRIV (box);
+
+  g_return_if_fail (GTK_IS_LIST_BOX (box));
+
+  if (priv->show_separators == show_separators)
+    return;
+
+  priv->show_separators = show_separators;
+
+  if (show_separators)
+    gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (box)), "separators");
+  else
+    gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET (box)), "separators");
+
+  g_object_notify_by_pspec (G_OBJECT (box), properties[PROP_SHOW_SEPARATORS]);
+}
+
+/**
+ * gtk_list_box_get_show_separators:
+ * @box: a #GtkListBox
+ *
+ * Returns whether the list box should show separators
+ * between rows.
+ *
+ * Returns: %TRUE if the list box shows separators
+ */
+gboolean
+gtk_list_box_get_show_separators (GtkListBox *box)
+{
+  GtkListBoxPrivate *priv = BOX_PRIV (box);
+
+  g_return_if_fail (GTK_IS_LIST_BOX (box));
+
+  return priv->show_separators;
+}
index 4640f6a4f9d9543cf14b7da7fab896c5b285bd2a..9ad9e5cf18eb7b69dddcf250a2e0e6ced55d744d 100644 (file)
@@ -300,6 +300,12 @@ void           gtk_list_box_bind_model                   (GtkListBox
                                                           gpointer                      user_data,
                                                           GDestroyNotify                user_data_free_func);
 
+GDK_AVAILABLE_IN_ALL
+void           gtk_list_box_set_show_separators          (GtkListBox                   *box,
+                                                          gboolean                      show_separators);
+GDK_AVAILABLE_IN_ALL
+gboolean       gtk_list_box_get_show_separators          (GtkListBox                   *box);
+
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkListBox, g_object_unref)
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkListBoxRow, g_object_unref)